#pragma once

#include <vector>
#include <pthread.h>
#include <atomic>   //c++11里的原子操作
#include <list>

//线程池相关类
class CThreadPool{
public:
    CThreadPool();
    ~CThreadPool();
    bool Create(int threadNum);// 创建所有线程
    void StopAll();// 释放所有线程
    // 收到一个完整消息后，入消息队列，并触发线程池中线程来处理该消息
    void InMsgRecvQueueAndSignal(char *buf);
    void Call();// 调一个线程来工作
    // 获取接收消息队列大小
    int  GetRecvMsgQueueCount(){return m_iRecvMsgQueueCount;}

private:
    // 线程结构体
    struct ThreadItem{
        pthread_t _Handle;// 线程句柄
        CThreadPool *_pThis;// 记录线程池的指针
        bool ifrunning;// 是否启动中，启动起来后，才允许调用StopAll()来释放

        // 构造函数
        ThreadItem(CThreadPool *pthis):_pThis(pthis),ifrunning(false){}
        // 析构函数
        ~ThreadItem(){}
    };

    static void* ThreadFunc(void *threadData);// 新线程的线程回调函数  
    void ClearMsgRecvQueue();// 清理接收消息队列

    static pthread_mutex_t m_pthreadMutex;// 线程同步互斥量（线程同步锁）
    static pthread_cond_t m_pthreadCond;// 线程同步条件变量
    static bool m_shutdown;// 线程退出标志，false不退出，true退出
    int m_iThreadNum;// 要创建的线程数量
    std::atomic<int> m_iRunningThreadNum;// 运行中的线程数，原子操作
    time_t m_iLastEmgTime;// 上次发生线程不够用的时间,防止日志报的太频繁
    std::vector<ThreadItem *> m_threadVector;// 线程容器
    std::list<char *> m_MsgRecvQueue;// 接收数据消息队列
    int m_iRecvMsgQueueCount;// 收消息队列大小
};